#pragma once 

#include<cerrno>
#include<cstdlib>
#include<cstring>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

#include"log.hpp"
#include"err.hpp"

void Daemon()
{
    //1.忽略异常信号
    signal(SIGPIPE,SIG_IGN);
    signal(SIGCHLD,SIG_IGN);

    //2.守护进程不能是进程组组长
    if(fork()>0)
        exit(0);//父进程退出
    //子进程不会是进程组组长

    //3.新建会话，自己成为会话的话首进程
    pid_t ret=setsid();
    if((int)ret==-1)
    {
        logMessage(Fatal,"deamon error,%s,errno:%d",strerror(errno),errno);
        exit(DAEMON_ERR);
    }

    //4.可选，更改守护进程的工作路径
    //chdir("/");

    //5.处理后续的读写错误——文件描述符0,1,2
    int fd=open("/dev/null",O_RDWR);
    if(fd<0)
    {
        logMessage(Fatal,"open null error,%s,errno:%d",strerror(errno),errno);
        exit(OPEN_ERR);
    }
    //将0,1,2的内容重定向到null文件
    dup2(fd,0);
    dup2(fd,1);
    dup2(fd,2);
    close(fd);
}